/********************************************************
*Definicion de lista simplemente encadenada             *
*Author     :   Simon Emmanuel Gutierrez Brida          *
*Version    :   0.1                                     *
*Fecha      :   Septiembre/2011                         *
*------------------------------------------------       *
*Define la estructura y funcione asociadas al manejo    *
*de lista simplemente encadenada                        *
*Una lista esta formada por :                           *
*- inicio   : la cabeza de la lista                     *
*- longitud : la longitud de la lista                   *
*********************************************************/

#ifndef LISTA_H
#define LISTA_H

#include "nodo.h"
#include "../variable.h"
#include <stdbool.h>


typedef struct {
    Nodo    *inicio;
    int     longitud;
} Lista;

/*funciones publicas para manipular listas*/

/*constructores*/

/**
 * Construye una nueva lista vacia
 */
Lista* nuevaLista();

/*lectura de informacion*/

/**
 * Obtiene una variable en una lista dado su identificador
 * parametros
 * lista: la lista sobre la cual obtener la variable
 * id: el identificador de la variable a obtener
 */
Variable* obtener(Lista *lista, char *id);

/**
 * Obtiene una variable en una lista segun un indice
 * parametros
 * lista: la lista sobre la cual obtener la variable
 * index: el indice de la variable a obtener
 */
Variable* obtener_indexado(Lista *lista, int index);

/**
 * Obtiene la longitud de una lista
 * parametros
 * lista: la lista sobre la cual obtener la longitud
 */
int longitud(Lista *lista);

/**
 * Consulta sobre la existencia de una variable en una lista
 * parametros
 * lista: la lista sobre la cual consultar
 * var: la variable a buscar
 */
bool existe_var(Lista *lista, Variable *var);

/**
 * Consulta sobre la existencia de una variable en una lista mediante su identificador
 * parametros
 * lista: la lista sobre la cual consultar
 * id: el identificador de la variable a buscar
 */
bool existe_id(Lista *lista, char *id);

/*escritura de informacion*/

/**
 * Agrega una nueva variable a una lista
 * parametros
 * lista: la lista sobre la cual agregar la variable
 * var: la variable a agregar a la lista
 */
void agregar(Lista *lista, Variable *var);

/**
 * Elimina una variable de una lista mediante su identificador
 * paramtros
 * lista: la lista sobre la cual eliminar la variable
 * id: el identificador de la variable a eliminar
 */
void eliminar(Lista *lista, char *id);

#endif